package Vivienda;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStreamReader;
import java.net.ServerSocket;
import java.net.Socket;

public class ServerVideoStreaming extends Thread 
{
	private int puertoEscuchaPeticionVS;
	
	public ServerVideoStreaming(int puerto)
	{
		this.puertoEscuchaPeticionVS = puerto;
	}
	
	public void run()
	{
		try
		{
			ServerSocket servidor = new ServerSocket(this.puertoEscuchaPeticionVS);
			
			while(true)
			{
				// Espera a que haya una peticion de la cola y se la asigna a un hilo para que la trabaje
				new WorkerVideoStreaming(servidor.accept()).start();
			}
		}
		catch(Exception ex)
		{
			
		}
	}
}

class WorkerVideoStreaming extends Thread
{
	private Socket socketCliente;
	
	public WorkerVideoStreaming(Socket cliente)
	{
		this.socketCliente = cliente;
	}
	
	public void run()
	{
		try
		{
			BufferedReader lectorCliente = new BufferedReader(new InputStreamReader(this.socketCliente.getInputStream()));
			String mensaje = lectorCliente.readLine();
			lectorCliente.close();
			this.socketCliente.close();
			
			if(mensaje != null && mensaje.length() > 9)
			{
				int puertoEscuchaMobile = Integer.parseInt(mensaje.substring(0, 5).trim());
				String codigoCamara = mensaje.substring(5, 9);
				String ipMobile = mensaje.substring(9, mensaje.length());
				
				System.out.println("[Casa] Ha llegado la peticion de VS para la camara: " + codigoCamara);
				
				if(Principal.videosPorCamara.containsKey(codigoCamara))
				{
					// Inicia video Streaming
					
					String nombreArchivoVideo = Principal.videosPorCamara.get(codigoCamara);
					if(!(new File(nombreArchivoVideo).exists()))
						throw new Exception("NO existe el archivo: " + nombreArchivoVideo);
					
					System.out.println("SI Existe video para la camara. El nombre es: " + nombreArchivoVideo);
					
					FileInputStream videofis = new FileInputStream(nombreArchivoVideo);
					byte[] bytesVideo = new byte[videofis.available()];  
					int totalBytes = videofis.read(bytesVideo);
					videofis.close();
					
					System.out.println("Se han leido bytes: " + totalBytes);
					
					Socket socketMobile = new Socket(ipMobile, puertoEscuchaMobile);
					
					socketMobile.getOutputStream().write(bytesVideo);
					
					socketMobile.close();
					
					System.out.println("Se han enviado todos los bytes" + bytesVideo.length);
				}
				else
					throw new Exception("NO existe video registrado para esa camara");
			}
		}
		catch(Exception ex)
		{
			ex.printStackTrace();
		}
	}
}